<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>go-to-js</title>
    <script type="application/javascript">
        function clearMessage() {
            document.getElementById("message").innerHTML = "";
        }

        function writeMessage(data) {
            let message = document.getElementById("message");
            message.innerHTML = message.innerHTML + data + "<br>"
        }

        let gId = 0
        //ipc.emit函数有3个参数
        //参数1 事件名        必填    string类型
        //参数2 参数          非必填  array类型,传递到Go中的数据,
        //                          参数只保留了 string, integer, double, boolean 的对应关系，其它类型在 go和 js数据传递时不支持
        //                          参数是以js调用时传递的参数下标位置开始计算，从0开始表示第1个参数
        //参数3 回调函数      非必填   function类型, go返回的结果

        //调用Go中监听的事件
        function goOnEventDemo() {
            clearMessage()
            //参数传递,从下标0开始表示第1个参数
            ipc.emit('go-on-event-demo', ['传递的数据 ' + gId], function (result) {
                writeMessage("result: " + result)
            })
        }

        //带有返回值的事件
        function goOnEventDemoReturn() {
            clearMessage()
            //参数传递,从下标0开始表示第1个参数
            var strData = ""
            for (var i = 0; i < 100000; i++) {
                strData += "[" + i + "]";
            }
            ipc.emit('go-on-event-demo-return', ['传递的数据:' + strData, 99999, false, 9999.999, "这是第五个参数"], function (data) {
                writeMessage("data-length: " + data.length)
                writeMessage("data: " + data)
            })
        }

        // 在Go中监听一个事件, 不带返回值
        // 使用形参接收参数
        // 在JS中入参类型必须相同
        function goOnEventDemoArgument() {
            ipc.emit('go-on-event-demo-argument', [100 + gId, '字符串-Energy' + gId, 1000.001 + gId, true, "字符串" + gId]);
        }

        // 在Go中监听一个事件, 带返回值
        // 使用形参接收参数
        // 在JS中入参类型必须相同
        function goOnEventDemoArgumentReturn() {
            ipc.emit('go-on-event-demo-argument-return', [100 + gId, '字符串-Energy' + gId, 1000.001 + gId, true, "字符串" + gId], function (result) {
                writeMessage("result: " + result)
            });
        }

        // 在Go中监听一个事件, 带返回值
        // 返回值使用返回变量接收
        /*
         * 介绍
         * emitWait: 使用变量接收返回参数
         * 入参
         *  参数一: 固定为事件名
         *  参数二: 可变，函数入参，或超时时间
         *  参数三: 固定超时时间
         *
         * 超时时间: 毫秒， 默认5000
         *
         */
        function goOnEventJSEmitWait(isAuto) {
            let result;
            // 定义最长等待时间 1000 毫秒
            result = ipc.emitWait("ipc-emit-wait", ["data(ipc-emit-wait-5000) " + gId], 1000)
            writeMessage("result-wait-5000: " + result)
            if (!isAuto){
                setTimeout(function () {
                    // 如果发生等待（未及时返回）页面将在这段时间内无法操作。
                    // 等待2秒
                    result = ipc.emitWait("ipc-emit-wait-2000", 2000)
                    writeMessage("result-wait-2000: " + result)
                })
            }
            // 定义最长等待时间 1 毫秒, <= 0 = 5000
            result = ipc.emitWait("ipc-emit-wait", ["data(ipc-emit-wait-1) " + gId], 1) // 1毫秒？？
            writeMessage("result-wait-1: " + result)
        }


        let intval = null;

        function autoEmit() {
            if (intval == null) {
                // cef ipc 不要 for {} 无间隔的调用
                intval = setInterval(function () {
                    goOnEventDemo()
                    goOnEventDemoArgument()
                    goOnEventDemoArgumentReturn()
                    //goOnEventJSEmitWait(true)
                    gId++
                })
            } else {
                clearInterval(intval)
                intval = null
            }
        }
    </script>
</head>
<body style="margin: 0px;padding: 0px;">
Go中监听事件，JS中调用<br>
<button onclick="goOnEventDemo()">go-on-event-demo</button>
<button onclick="goOnEventDemoReturn()">go-on-event-demo-return</button>
<button onclick="goOnEventDemoArgument()">go-on-event-demo-argument</button>
<button onclick="goOnEventDemoArgumentReturn()">go-on-event-demo-argument-return</button>
<br>
<button onclick="goOnEventJSEmitWait()">ipc-emit-wait</button>
<button onclick="autoEmit()">autoEmit</button>
<div id="message"></div>
</body>
</html>